/*
 * listPPD.h
 *
 *  Created on: 11/12/2011
 *      Author: utn_so
 */

#ifndef LISTPPD_H_
#define LISTPPD_H_

#include "../General/Serializable/serializable.h"
#include <pthread.h>
#include <stdint.h>
#include <semaphore.h>

#define MAX_PPD 20
//ListPPD -> FIFO

typedef struct {
	Message msg;
	int32_t socket;
} ListPPD_data;

typedef struct Nodo_ListPPD {
	ListPPD_data data;
	struct Nodo_ListPPD *nxt;
} __attribute__((packed)) Nodo_ListPPD;

typedef struct ListPPD {
	Nodo_ListPPD *Head;
	Nodo_ListPPD *Tail;
	pthread_mutex_t mutex;
	int32_t count;
	sem_t semList;
} __attribute__((packed)) ListPPD;

void ListPPD_Create(ListPPD * aListPPD);
void ListPPD_Push(ListPPD * aListPPD, ListPPD_data data);
void ListPPD_Destroy(ListPPD * aListPPD);
Nodo_ListPPD * ListPPD_getAndDisposeFirst(ListPPD * aListPPD);
//funciones para NO productor-consumidor
void ListPPD_DisposeFirst(ListPPD * aListPPD);
Nodo_ListPPD * ListPPD_getAndDisposeFirstUnSync(ListPPD * aListPPD);
void ListPPD_Add(ListPPD * aListPPD, ListPPD_data data);
void nodoListPPD_Free(Nodo_ListPPD * toDelete);

#endif /* LISTPPD_H_ */
